﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.modulos;
using System.Windows.Input;
using System.Collections.Specialized;
using System.Drawing.Printing;

namespace produccion.vistamodelo
{

    class VMFacturacionVarios : ViewModelBase, IDataErrorInfo
    {
        #region Campos
        private CLSMAEREF _refe = new CLSMAEREF();
            private CLSMAECLIP _cliente = new CLSMAECLIP();
            private List<CLSCCPFAC> _conceptosfac = new List<CLSCCPFAC>();
            private CLSCCPFAC _selconceptosfac = new CLSCCPFAC();
            private MFacturacion.devoluciones _dev = new MFacturacion.devoluciones();
            private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        #endregion

        #region Constructor
            
            public VMFacturacionVarios()
            {
                try
                {
                    List<CLSMAECLIP> lisclientes = new CLSMAECLIP().listaCliente();
                    _buscarCliente = new VMbuscarGeneral((from cli in lisclientes select new VMlistaGenerica 
                        { strColumna1 = cli.CODCLI_CLI, strColumna2 = cli.NOMCLI_CLI, strColumna3 = cli.NITCLI_CLI }).ToList());
                    buscarCliente.PropertyChanged += OnBuscarClientePropertyChanged;
                    buscarCliente.gridBuscar.columna1.strNombre = "Código";
                    buscarCliente.gridBuscar.columna2.strNombre = "Nombre Cliente";
                    buscarCliente.gridBuscar.columna3.strNombre = "Nit Cliente";

                    lisfacturacionvarios.CollectionChanged += OnCollectionChanged;

                    cargarConceptos();
                    dtmFecha = DateTime.Now;

                    if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                    {
                        MDOgeneral.conectar();
                    }
                    strTituloVentana = "Facturacion Varios - Usuario: " + MDOgeneral.usuario + " - [FRMFacturacionVarios]";

                    // Se imprime la factura
                    //var imp = new ImprimirFacturaVarios();
                    //string strMensaje = "";
                    //imp.ImprimirDatos("0060001", "A", "PDF24", out strMensaje);
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

        #endregion
        
        #region Comandos
            
            RelayCommand _cmdBuscarCliente;
            public ICommand cmdBuscarCliente
            {
                get
                {
                    if (_cmdBuscarCliente == null)
                    {
                        _cmdBuscarCliente = new RelayCommand(x => buscaClientes());
                    }
                    return _cmdBuscarCliente;
                }
            }

            RelayCommand _cmdBuscarReferencia;
            public ICommand cmdBuscarReferencia
            {
                get
                {
                    if (_cmdBuscarReferencia == null)
                    {
                        _cmdBuscarReferencia = new RelayCommand(x => buscaRef());
                    }
                    return _cmdBuscarReferencia;
                }
            }

            RelayCommand _cmdBuscarMP;
            public ICommand cmdBuscarMP
            {
                get
                {
                    if (_cmdBuscarMP == null)
                    {
                        _cmdBuscarMP = new RelayCommand(x => buscaMP());
                    }
                    return _cmdBuscarMP;
                }
            }

            RelayCommand _cmdGuardar;
            public ICommand cmdGuardar
            {
                get
                {
                    if (_cmdGuardar == null)
                    {
                        _cmdGuardar = new RelayCommand(x => this.guardar());
                    }
                    return _cmdGuardar;
                }
            }

            RelayCommand _cmdGuardarDevoluciones;
            public ICommand cmdGuardarDevoluciones
            {
                get
                {
                    if (_cmdGuardarDevoluciones == null)
                    {
                        _cmdGuardarDevoluciones = new RelayCommand(x => this.guardarDevoluciones());
                    }
                    return _cmdGuardarDevoluciones;
                }
            }

            RelayCommand _cmdImportarDevoluciones;
            public ICommand cmdImportarDevoluciones
            {
                get
                {
                    if (_cmdImportarDevoluciones == null)
                    {
                        _cmdImportarDevoluciones = new RelayCommand(r => importarDevoluciones());
                    }
                    return _cmdImportarDevoluciones;
                }
            }

            RelayCommand _cmdImportarReconocidos;
            public ICommand cmdImportarReconocidos
            {
                get
                {
                    if (_cmdImportarReconocidos == null)
                    {
                        _cmdImportarReconocidos = new RelayCommand(r => importarReconocidos());
                    }
                    return _cmdImportarReconocidos;
                }
            }

            RelayCommand _cmdSalir;
            public ICommand cmdSalir
            {
                get
                {

                    if (_cmdSalir == null)
                    {
                        _cmdSalir = new RelayCommand(Salir);
                    }
                    return _cmdSalir;
                }
            }

            RelayCommand _cmdSalirX;
            public ICommand cmdSalirX
            {
                get
                {

                    if (_cmdSalirX == null)
                    {
                        _cmdSalirX = new RelayCommand(SR => SalirX());
                    }
                    return _cmdSalirX;
                }
            }

        #endregion

        #region Propiedades

            private string _strTipoDocumento;
            public string strTipoDocumento
            {
                get { return _strTipoDocumento; }
                set 
                { 
                    _strTipoDocumento = value;
                    buscarConcecutivo(_strTipoDocumento);
                    base.OnPropertyChanged("strTipoDocumento"); 
                }
            }

            private string _strNumeroDocumento;
            public string strNumeroDocumento
            {
                get { return _strNumeroDocumento; }
                set { _strNumeroDocumento = value; base.OnPropertyChanged("strNumeroDocumento"); }
            }

            private DateTime _dtmFecha;
            public DateTime dtmFecha
            {
                get { return _dtmFecha; }
                set { _dtmFecha = value; base.OnPropertyChanged("dtmFecha"); }
            }

            public List<CLSCCPFAC> conceptosfac
            {
                get { return _conceptosfac; }
                set { _conceptosfac = value; base.OnPropertyChanged("conceptosfac"); }
            }

            public CLSCCPFAC selconceptosfac
            {
                get { return _selconceptosfac; }
                set 
                { 
                    _selconceptosfac = value; 
                    base.OnPropertyChanged("selconceptosfac");
                    if (selconceptosfac != null)
                    {
                        if (selconceptosfac.CODCCP_CFC != null)
                        {
                            numBaseRetencion = selconceptosfac.BASRTE_CFC;
                            numPorcRetencion = selconceptosfac.PORRTE_CFC;

                            if (strNumeroDocumento != null)
                            {
                                if (strCodigoCliente != null)
                                {
                                    if (strNombreCliente != null)
                                        logOK = false;
                                    else
                                        logOK = true;
                                }
                                else
                                    logOK = true;
                            }
                            else
                                logOK = true;
                        }
                        else
                            logOK = true;
                    }
                }
            }

            private string _strEmpresa;
            public string strEmpresa
            {
                get { return _strEmpresa; }
                set 
                { 
                    _strEmpresa = value;
                    buscarConcecutivo(strTipoDocumento);
                    base.OnPropertyChanged("strEmpresa"); 
                }
            }

            public string strCodigoCliente
            {
                get { return _cliente.CODCLI_CLI; }
                set 
                { 
                    _cliente.CODCLI_CLI = value;
                    if (value != null)
                    {
                        if (value.Length == 3)
                        {
                            consultaCliente();
                        }
                        else
                            logOK = true;
                    }
                    base.OnPropertyChanged("strCodigoCliente");
                    base.OnPropertyChanged("strNombreCliente");
                }
            }

            public string strNombreCliente
            {
                get { return _cliente.NOMCLI_CLI; }
                set { _cliente.NOMCLI_CLI = value; base.OnPropertyChanged("strNombreCliente"); }
            }

            private string _strDetalle;
            public string strDetalle
            {
                get { return _strDetalle; }
                set { _strDetalle = value; base.OnPropertyChanged("strDetalle"); }
            }

            private double _numDescuento;
            public double numDescuento
            {
                get { return _numDescuento; }
                set { _numDescuento = value; base.OnPropertyChanged("numDescuento"); }
            }

            private double _numTotalIva;
            public double numTotalIva
            {
                get { return _numTotalIva; }
                set { _numTotalIva = value; base.OnPropertyChanged("numTotalIva"); }
            }

            private double _numIva;
            public double numIva
            {
                get { return _numIva; }
                set { _numIva = value; base.OnPropertyChanged("numIva"); }
            }

            private double _numRetencion;
            public double numRetencion
            {
                get { return _numRetencion; }
                set { _numRetencion = value; }
            }

            private double _numFlete;
            public double numFlete
            {
                get { return _numFlete; }
                set 
                { 
                    _numFlete = value;
                    if (value > 0)
                        numTotal = numTotal + value;
                    base.OnPropertyChanged("numFlete"); 
                }
            }

            private double _numSubtotal;
            public double numSubtotal
            {
                get { return _numSubtotal; }
                set { _numSubtotal = value; base.OnPropertyChanged("numSubtotal"); }
            }

            private double _numTotal;
            public double numTotal
            {
                get { return _numTotal; }
                set { _numTotal = value; base.OnPropertyChanged("numTotal"); }
            }

            private Int32 _numBaseRetencion;
            public Int32 numBaseRetencion
            {
                get { return _numBaseRetencion; }
                set { _numBaseRetencion = value; base.OnPropertyChanged("numBaseRetencion"); }
            }

            private double _numPorcRetencion;
            public double numPorcRetencion
            {
                get { return _numPorcRetencion; }
                set { _numPorcRetencion = value; base.OnPropertyChanged("numPorcRetencion"); }
            }

            private Int32 _numMaxFactura;
            public Int32 numMaxFactura
            {
                get { return _numMaxFactura; }
                set { _numMaxFactura = value; base.OnPropertyChanged("numMaxFactura"); }
            }

            private VMbuscarGeneral _buscarCliente;
            public VMbuscarGeneral buscarCliente
            {
                get { return _buscarCliente; }
                set { _buscarCliente = value; base.OnPropertyChanged("buscarCliente"); }
            }

            private ObservableCollection<VMFacturacionVariosDetalle> _lisfacturacionvarios = new ObservableCollection<VMFacturacionVariosDetalle>();
            public ObservableCollection<VMFacturacionVariosDetalle> lisfacturacionvarios
            {
                get { return _lisfacturacionvarios; }
                set { _lisfacturacionvarios = value; base.OnPropertyChanged("lisfacturacionvarios"); }
            }

            private VMFacturacionVariosDetalle _sellisfacturacionvarios;
            public VMFacturacionVariosDetalle sellisfacturacionvarios
            {
                get { return _sellisfacturacionvarios; }
                set { _sellisfacturacionvarios = value; base.OnPropertyChanged("sellisfacturacionvarios"); }
            }

            private ObservableCollection<VMImportarDevoluciones> _lisdevoluciones = new ObservableCollection<VMImportarDevoluciones>();
            public ObservableCollection<VMImportarDevoluciones> lisdevoluciones
            {
                get { return _lisdevoluciones; }
                set { _lisdevoluciones = value; base.OnPropertyChanged("lisdevoluciones"); }
            }

            private VMImportarDevoluciones _sellisdevoluciones;
            public VMImportarDevoluciones sellisdevoluciones
            {
                get { return _sellisdevoluciones; }
                set { _sellisdevoluciones = value; base.OnPropertyChanged("sellisdevoluciones"); }
            }

            private int _numIndex = 0;
            public int numIndex
            {
                get { return _numIndex; }
                set { _numIndex = value; base.OnPropertyChanged("numIndex"); }
            }

            private string _strTituloVentana;
            public string strTituloVentana
            {
                get { return _strTituloVentana; }
                set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
            }

            private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
            public MDOgeneral.mensaje msn
            {
                get { return _msn; }
                set { _msn = value; base.OnPropertyChanged("msn"); }
            }

            private Boolean _logValido;
            public Boolean logValido
            {
                get { return _logValido; }
                set { _logValido = value; base.OnPropertyChanged("logValido"); }
            }

            private Boolean _logOK=true;
            public Boolean logOK
            {
                get { return _logOK; }
                set { _logOK = value; base.OnPropertyChanged("logOK"); }
            }

            private Boolean _IsOpenDevoluciones = false;
            public Boolean IsOpenDevoluciones
            {
                get { return _IsOpenDevoluciones; }
                set { _IsOpenDevoluciones = value; base.OnPropertyChanged("IsOpenDevoluciones"); }
            }

            private Boolean _logTodos = true;
            public Boolean logTodos
            {
                get { return _logTodos; }
                set
                {
                    _logTodos = value;
                    if (_logTodos)
                    {
                        selTodos();
                    }
                    else
                    {
                        selNinguno();
                    }
                    base.OnPropertyChanged("logTodos");
                }
            }

            private string _strParametros;
            public string strParametros
            {
                get { return _strParametros; }
                set { _strParametros = value; base.OnPropertyChanged("strParametros"); }
            }

            private string _strTitulo = "";
            public string strTitulo
            {
                get { return _strTitulo; }
                set { _strTitulo = value; base.OnPropertyChanged("strTitulo"); }
            }

            private string _strTipoImportacion;
            public string strTipoImportacion
            {
                get { return _strTipoImportacion; }
                set { _strTipoImportacion = value; base.OnPropertyChanged("strTipoImportacion"); }
            }
            
        #endregion

        #region Metodos

            public void agregaItem()
            {
                try
                {
                    lisfacturacionvarios.Add(new VMFacturacionVariosDetalle
                    {
                        strCodigo = "",
                        strDescripcion = "",
                        numCantidad = 0,
                        numValor = 0,
                        numIva = 0,
                        numDescuento = 0,
                        numSubtotal = 0,
                        numTotalIva = 0
                    });
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void buscaMP()
            {
                try
                {
                    int auxIndex = numIndex;
                    FRMBuscarCol frm = new FRMBuscarCol();
                    frm.RequiereColor = true;
                    frm.EsReferencia = false;
                    frm.logNuevo = true;
                    frm.txtNombre.Text = "";
                    frm.ShowDialog();
                    if (!String.IsNullOrEmpty(frm.Retorno))
                    {
                        int numFila = -1;
                        foreach (VMFacturacionVariosDetalle xx in lisfacturacionvarios)
                        {
                            if (!String.IsNullOrEmpty(xx.strDescripcion))
                            {
                                numFila = numFila + 1;
                            }
                        }

                        if (numFila > numIndex)
                        {
                            auxIndex = numIndex;
                        }
                        else
                        {
                            if (lisfacturacionvarios[numIndex].numSubtotal > 0)
                            {
                                auxIndex = auxIndex + 1;
                            }
                        }

                        lisfacturacionvarios[auxIndex].strCodigo = frm.Retorno.Substring(0, 10);
                        lisfacturacionvarios[auxIndex].strDescripcion = frm.Retorno.Substring(11);
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void buscaRef()
            {
                try
                {
                    int auxIndex = numIndex;
                    FRMBuscarCol frm = new FRMBuscarCol();
                    frm.RequiereColor = true;
                    frm.EsReferencia = true;
                    frm.logNuevo = true;
                    frm.txtNombre.Text = "";
                    frm.ShowDialog();
                    if (!String.IsNullOrEmpty(frm.Retorno))
                    {
                        int numFila = -1;
                        foreach (VMFacturacionVariosDetalle xx in lisfacturacionvarios)
                        {
                            if (!String.IsNullOrEmpty(xx.strDescripcion))
                            {
                                numFila = numFila + 1;
                            }
                        }

                        if (numFila > numIndex)
                        {
                            auxIndex = numIndex;
                        }
                        else
                        {
                            if (lisfacturacionvarios[numIndex].numSubtotal > 0)
                            {
                                auxIndex = auxIndex + 1;
                            }
                        }

                        lisfacturacionvarios[auxIndex].strCodigo = frm.Retorno;
                        _refe.CODREF_REF = frm.Retorno.Substring(0, 4);
                        _refe.Consultar();
                        if (_refe.EXISTE)
                        {
                            lisfacturacionvarios[auxIndex].strDescripcion = _refe.NOMREF_REF;
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void buscarConcecutivo(string strtipo)
            {
                try
                {
                    switch (strtipo)
                    {
                        case "F":
                            concecutivoFactura();
                            consultaInfFactura();
                            break;
                        case "C":
                            consecutivoNC();
                            consultaInfFactura();
                            break;
                        case "D":
                            consecutivoND();
                            break;
                        default:
                            break;
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void concecutivoFactura()
            {
                try
                {
                    DataTable dt = new MFacturacion.detalleOrdenes().consultaConsecutivoFactura(strEmpresa);
                    if (dt.Rows.Count > 0)
                    {
                        if (strEmpresa == "A")
                            //strNumeroDocumento = "00" + Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString()) + 1);
                            strNumeroDocumento = Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString()) + 1).PadLeft(7, '0');
                        else
                        {
                            if (Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring(1)) + 1).Length==4)
                                strNumeroDocumento = "P00" + Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring(1)) + 1);
                            if (Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring(1)) + 1).Length == 5)
                                strNumeroDocumento = "P0" + Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring(1)) + 1);
                            if (Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring(1)) + 1).Length == 6)
                                strNumeroDocumento = "P" + Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring(1)) + 1);
                        }
                    }
                    //Agrego registros en blanco para poder controlar el grid cuando se agrega desde busqueda F1 y F2
                    if (lisfacturacionvarios.Count == 0)
                    {
                        for (int i = 1; i < 31; i++)
                        {
                            agregaItem();
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void consecutivoNC()
            {
                try
                {
                    DataTable dt = new MFacturacion.detalleOrdenes().consultaConsecutivoNC(strEmpresa);
                    if (dt.Rows.Count > 0)
                    {
                        if (strEmpresa == "A")
                           //strNumeroDocumento = "000" + Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString()) + 1);
                            strNumeroDocumento = Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString()) + 1).PadLeft(7,'0');
                        else
                           strNumeroDocumento =  dt.Rows[0][2].ToString().Substring(0,1) + (Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString().Substring (1)) + 1).PadLeft (6,'0'));
                           //strNumeroDocumento = "0" + Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString()) + 1);
                    }
                    //Agrego registros en blanco para poder controlar el grid cuando se agrega desde busqueda F1 y F2
                    if (lisfacturacionvarios.Count == 0)
                    {
                        for (int i = 1; i < 101; i++)
                        {
                            agregaItem();
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void consecutivoND()
            {
                try
                {
                    DataTable dt = new MFacturacion.detalleOrdenes().consultaConsecutivoND(strEmpresa);
                    if (dt.Rows.Count > 0)
                    {
                        strNumeroDocumento = Convert.ToString(Convert.ToInt32(dt.Rows[0][2].ToString()) + 1);
                    }
                    //Agrego registros en blanco para poder controlar el grid cuando se agrega desde busqueda F1 y F2
                    if (lisfacturacionvarios.Count == 0)
                    {
                        for (int i = 1; i < 31; i++)
                        {
                            agregaItem();
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
 
            private void cargarConceptos()
            {
                try
                {
                    conceptosfac = new CLSCCPFAC().listarConceptosFac();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void consultaCliente()
            {
                try
                {
                    if (_cliente != null)
                    {
                        if (_cliente.CODCLI_CLI != null)
                        {
                            _cliente.consultar();
                            strNombreCliente = _cliente.NOMCLI_CLI;

                            if (strNumeroDocumento != null)
                            {
                                if (selconceptosfac != null)
                                {
                                    if (selconceptosfac.CODCCP_CFC != null)
                                        logOK = false;
                                    else
                                        logOK = true;
                                }
                                else
                                    logOK = true;
                            }
                            else
                                logOK = true;
                        }
                        else
                            logOK = true;
                    }
                    else
                        logOK = true;
                    base.OnPropertyChanged("strNombreCliente");
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void buscaClientes()
            {
                try
                {
                    buscarCliente.IsOpen = true;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void OnBuscarClientePropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                try
                {
                    if (e.PropertyName == "IsOpen")
                    {
                        if (buscarCliente.gridBuscar.selLista != null)
                        {
                            if (buscarCliente.gridBuscar.selLista.strColumna1 != null)
                            {
                                strCodigoCliente = buscarCliente.gridBuscar.selLista.strColumna1;
                                _cliente.CODCLI_CLI = strCodigoCliente;
                                consultaCliente();
                            }
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            
            void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
            {
                try
                {
                    if (e.NewItems != null && e.NewItems.Count != 0)
                    {
                        foreach (VMFacturacionVariosDetalle fv in e.NewItems)
                        {
                            fv.validarItems += validaItem;
                            fv.pideCliente += devuelveCliente;
                            fv.PropertyChanged += OnPropertyChanged;
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public string validaItem(string strCodigo)
            {
                try
                {
                    if (strCodigo != null)
                    {
                        if (strCodigo.Length == 4 || strCodigo.Length == 6 || strCodigo.Length == 10)
                        {
                            int i = (from fv in lisfacturacionvarios where fv.strCodigo.Trim().Equals(strCodigo.Trim()) select fv).ToList().Count();
                            if (i > 1)
                            {
                                return "Código ya existe";
                            }
                        }
                    }
                    int numFila = -1;
                    foreach (VMFacturacionVariosDetalle xx in lisfacturacionvarios)
                    {
                        if (!String.IsNullOrEmpty(xx.strDescripcion))
                        {
                            numFila = numFila + 1;
                        }
                    }
                    numIndex = numFila;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            public string devuelveCliente(string strCodCli)
            {
                try
                {
                    if (strCodigoCliente != null)
                        return strCodigoCliente;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                try
                {
                    calcularValores();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            void calcularValores()
            {
                numDescuento = 0;
                numIva = 0;
                numTotalIva = 0;
                numSubtotal = 0;

                logValido = ((from fv in lisfacturacionvarios where fv.IsValid.Equals(false) select fv.IsValid).ToList().Count()) > 0 ? true : false;

                List<VMFacturacionVariosDetalle> all = (from fv in lisfacturacionvarios select fv).ToList();
                foreach (VMFacturacionVariosDetalle fc in all)
                {
                    if (fc.numCantidad > 0)
                    {
                        if (fc.numDescuento > 0)
                        {
                            numDescuento = numDescuento + ((fc.numValor * fc.numCantidad) - ((1 - (fc.numDescuento / 100)) * (fc.numValor * fc.numCantidad)));
                        }
                        if (fc.numIva > 0)
                        {
                            numIva = fc.numIva;
                            numTotalIva = numTotalIva + ((numIva / 100) * ((fc.numValor * fc.numCantidad) - numDescuento));
                        }

                        numSubtotal = numSubtotal + (fc.numValor * fc.numCantidad);
                    }
                }
                if (_cliente != null)
                {
                    if (_cliente.APLRTE_CLI == "S" && numSubtotal >= numBaseRetencion && (strTipoDocumento == "F" || strTipoDocumento == "C"))
                    {
                        numRetencion = Math.Round((numPorcRetencion / 100) * numSubtotal);
                        base.OnPropertyChanged("numRetencion");
                    }
                }
                numTotal = numSubtotal + numTotalIva - numRetencion + numFlete - numDescuento;
            }

            public void consultaInfFactura()
            {
                try
                {
                    DataTable fac = new MFacturacion.detalleOrdenes().consultaInfFactura();
                    foreach (DataRow dr in fac.Rows)
                    {
                        if (dr[0].ToString().Trim() == "TAR")
                        {
                            numIva = Convert.ToDouble(dr[2].ToString().Trim());
                        }

                        if (dr[0].ToString().Trim() == "FAC")
                        {
                            numMaxFactura = Convert.ToInt32(dr[2].ToString().Trim());
                        }
                    }

                    int i = 0;
                    bool result = int.TryParse(strNumeroDocumento, out i);

                    if (result == true)
                    {
                        if (numMaxFactura - Convert.ToInt32(strNumeroDocumento) <= 300)
                        {
                            msn.texto = "Recuerde avisar a contabilidad que solicite a la DIAN una nueva numeración.";
                            msn.tipo = false;
                        }
                    }
                    else
                    {
                        if (numMaxFactura - Convert.ToInt32(strNumeroDocumento.Substring(1)) <= 300)
                        {
                            msn.texto = "Recuerde avisar a contabilidad que solicite a la DIAN una nueva numeración.";
                            msn.tipo = false;
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public void guardar()
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;

                    // Se captura la impresora por defecto
                    string strImpresora = "";
                    foreach (string strPrinter in PrinterSettings.InstalledPrinters)
                    {
                        PrinterSettings a = new PrinterSettings();
                        a.PrinterName = strPrinter.ToString();
                        if (a.IsDefaultPrinter)
                        {
                            strImpresora = a.PrinterName;
                        }
                    }

                    string strTipoDocum="";
                    string strTipodeDocumento = "";
                    switch (strTipoDocumento)
                    {
                        case "F":
                            strTipoDocum = "FA";
                            strTipodeDocumento = "FACTURA DE VENTA";
                            break;
                        case "C":
                            strTipoDocum = "NC";
                            strTipodeDocumento = "  NOTA CREDITO  ";
                            break;
                        case "D":
                            strTipoDocum = "ND";
                            strTipodeDocumento = "   NOTA DEDITO  ";
                            break;
                        default:
                            strTipoDocum = "FA";
                            break;
                    }

                    DateTime dtmVence = DateTime.Now.Date;
                    if (Convert.ToInt32(_cliente.PLAZO_CLI) > 0)
                        dtmVence = Convert.ToDateTime(dtmFecha).Date.AddDays(Convert.ToInt16(_cliente.PLAZO_CLI));
                    else
                        dtmVence = Convert.ToDateTime(dtmFecha).Date;
                    
                    List<MFacturacion.facturacionVarios> lstAgregar = (from fv in lisfacturacionvarios where !String.IsNullOrEmpty(fv.strDescripcion) select fv.getItems()).ToList();

                    buscarConcecutivo(strTipoDocumento  );

                    if (_repositorio.guardarFacturaVarios(strNumeroDocumento, strCodigoCliente, dtmFecha, dtmVence, numTotal, numTotalIva, numRetencion, numDescuento, numFlete, selconceptosfac.CODCCP_CFC, strTipoDocum, strEmpresa, strDetalle, strParametros, lstAgregar))
                    {
                        msn.texto = "La factura varios se guardo con exito.";
                        msn.tipo = true;

                        // Se imprime la factura
                        var imp = new ImprimirFacturaVarios();
                        string strMensaje = "";
                        imp.ImprimirDatos(strNumeroDocumento, strEmpresa, strImpresora, out strMensaje, 2, strTipodeDocumento, false, false);
                        //PDF24 FS-3140MFP+
                        // Limpia el formulario
                        limpiar();
                    }
                    else
                    {
                        msn.texto = "La información de facturación varios no se pudo grabar.";
                        msn.tipo = false;
                    }


                    Mouse.OverrideCursor = Cursors.Arrow;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }
            
            private void limpiar()
            {
                try
                {
                    strTipoDocumento = null;
                    strEmpresa = null;
                    strCodigoCliente = null;
                    strNombreCliente = null;
                    strNumeroDocumento = null;
                    dtmFecha = DateTime.Now;
                    strDetalle = null;
                    lisfacturacionvarios.Clear();
                    selconceptosfac = null;
                    numDescuento = 0;
                    numIva = 0;
                    numTotalIva = 0;
                    numTotal = 0;
                    numSubtotal = 0;
                    numFlete = 0;
                    numRetencion = 0;

                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void importarDevoluciones()
            {
                try
                {
                    strTitulo = "      Devoluciones Pendientes por NC";
                    strTipoImportacion = "D";
                    List<MFacturacion.devoluciones> listadev = _dev.consultar(strCodigoCliente, strTipoImportacion);
                    if (listadev.Count > 0)
                    {
                        int nunCuenta = 0;
                        List<VMImportarDevoluciones> all = (from dev in listadev select new VMImportarDevoluciones(dev)).ToList();
                        foreach (VMImportarDevoluciones devs in all)
                        {
                            nunCuenta = nunCuenta + 1;
                        }
                        lisdevoluciones = new ObservableCollection<VMImportarDevoluciones>(all);

                        IsOpenDevoluciones = true;
                    }
                    else
                    {
                        MessageBox.Show("No hay Devoluciones pendientes para importar.", "Información", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
                    }

                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void importarReconocidos()
            {
                try
                {
                    strTitulo = "      Reconocidos Pendientes por NC";
                    strTipoImportacion = "C";
                    List<MFacturacion.devoluciones> listadev = _dev.consultar(strCodigoCliente, strTipoImportacion);
                    if (listadev.Count > 0)
                    {
                        int nunCuenta = 0;
                        List<VMImportarDevoluciones> all = (from dev in listadev select new VMImportarDevoluciones(dev)).ToList();
                        foreach (VMImportarDevoluciones devs in all)
                        {
                            nunCuenta = nunCuenta + 1;
                        }
                        lisdevoluciones = new ObservableCollection<VMImportarDevoluciones>(all);

                        IsOpenDevoluciones = true;
                    }
                    else
                    {
                        MessageBox.Show("No hay Reconocidos pendientes para importar.", "Información", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
                    }

                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void guardarDevoluciones()
            {
                try
                {
                    Mouse.OverrideCursor = Cursors.Wait;
                    int numcontador = 0;
                    strParametros = "";

                    if (lisdevoluciones.Count > 0)
                    {
                        lisfacturacionvarios.Clear();
                        foreach (VMImportarDevoluciones dev in lisdevoluciones)
                        {
                            if (dev.logIncluir == true)
                            {
                                if (numcontador == 0)
                                {
                                    // Primer registro le agrego un comentario
                                    if (strTipoImportacion == "D")
                                    {
                                        lisfacturacionvarios.Add(new VMFacturacionVariosDetalle
                                        {
                                            strCodigo = "",
                                            strDescripcion = "Nota Crédito por Devoluciones:",
                                            numCantidad = 0,
                                            numValor = 0,
                                            numIva = 0,
                                            numDescuento = 0,
                                            numSubtotal = 0,
                                            numTotalIva = 0
                                        });
                                    }
                                    else
                                    {
                                        lisfacturacionvarios.Add(new VMFacturacionVariosDetalle
                                        {
                                            strCodigo = "",
                                            strDescripcion = "Nota Crédito por Reconocidos:",
                                            numCantidad = 0,
                                            numValor = 0,
                                            numIva = 0,
                                            numDescuento = 0,
                                            numSubtotal = 0,
                                            numTotalIva = 0
                                        });
                                    }
                                }

                                numcontador = numcontador + 1;

                                //AGREGO EL ITEM DE LA LISTA DE DEVOLUCIONES a la lista del formulario de facturacion varios
                                lisfacturacionvarios.Add(new VMFacturacionVariosDetalle
                                {
                                    strCodigo = "",
                                    strDescripcion = "Rem.: " + dev.strRemision.Trim() + " Cod.: " + dev.strNombreReferencia.Trim() + " Col.: " + dev.strNombreColor.Trim() + " Tal.: " + dev.strTalla,
                                    numCantidad = 1,
                                    numValor = dev.numPrecio,
                                    numIva = 16,
                                    numDescuento = 0,
                                    numSubtotal = dev.numPrecio,
                                    numTotalIva = dev.numPrecio > 0 ? (dev.numPrecio * (100 / dev.numPrecio)) : 0
                                });

                                strParametros = strParametros + dev.strOrden.PadRight(7, ' ') + "-";
                            }
                        }
                    }

                    Mouse.OverrideCursor = Cursors.Arrow;
                    calcularValores();
                    IsOpenDevoluciones = false;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            private void selTodos()
            {
                foreach (VMImportarDevoluciones dev in lisdevoluciones)
                {
                    dev.logIncluir = true;
                }
            }

            private void selNinguno()
            {
                foreach (VMImportarDevoluciones dev in lisdevoluciones)
                {
                    dev.logIncluir = false;
                }
            }

            public void Salir(object frmFormulario)
            {
                try
                {
                    ((Window)frmFormulario).Close();
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

            public void SalirX()
            {
                lisdevoluciones.Clear();
                IsOpenDevoluciones = false;
            }

        #endregion

        #region IDataErrorInfo Members

            string IDataErrorInfo.Error { get { return null; } }

            string IDataErrorInfo.this[string propertyName]
            {
                get { return this.GetValidationError(propertyName); }
            }

        #endregion

        #region Validation

            /// <summary>
            /// Returns true if this object has no validation errors.
            /// </summary>
            /// 

            public bool IsValid
            {
                get
                {
                    foreach (string property in ValidatedProperties)
                        if (GetValidationError(property) != null)
                            return false;
                    return true;
                }
            }

            static readonly string[] ValidatedProperties = 
            { 
                "strTipoDocumento",
                "strNumeroDocumento",
                "selconceptosfac",
                "strEmpresa",
                "strCodigoCliente",
                "numFlete",
                "numTotal"
            };

            string GetValidationError(string propertyName)
            {
                if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                    return null;

                string error = null;

                switch (propertyName)
                {
                    case "strTipoDocumento":
                        error = this.ValidateTipoDocumento();
                        break;
                    case "strNumeroDocumento":
                        error = this.ValidateNumeroDocumento();
                        break;
                    case "selconceptosfac":
                        error = this.ValidateConcepto();
                        break;
                    case "strEmpresa":
                        error = this.ValidateEmpresa();
                        break;
                    case "strCodigoCliente":
                        error = this.ValidateCliente();
                        break;
                    case "numFlete":
                        error = this.ValidateFlete();
                        break;
                    case "numTotal":
                        error = this.ValidateValor();
                        break;
                    default:
                        Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                        break;
                }
                return error;
            }

            string ValidateTipoDocumento()
            {
                try
                {
                    if (strTipoDocumento == null) { return "Debe seleccionar un tipo de documento"; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateNumeroDocumento()
            {
                try
                {
                    if (strNumeroDocumento == null) { return "Debe seleccionar un tipo de documento para poder asignar el nro del documento."; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateConcepto()
            {
                try
                {
                    if (selconceptosfac == null)
                    {
                        return "Debe seleccionar un concepto.";
                    }
                    else
                    {
                        if (selconceptosfac.NOMCCP_CFC == null)
                            return "Debe seleccionar un concepto.";
                    }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateEmpresa()
            {
                try
                {
                    if (strEmpresa == null) { return "Debe seleccionar la empresa que va generar el documento"; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateCliente()
            {
                try
                {
                    if (strCodigoCliente == null)
                    { 
                        return "Debe ingresar el código del cliente."; 
                    }
                    else
                    {
                        if (strNombreCliente == null) { return "Debe ingresar el código del cliente."; }
                    }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateFlete()
            {
                try
                {
                    if (numFlete < 0) { return "Valor de flete no valido"; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateValor()
            {
                try
                {
                    if (numTotal <= 0) { return "Valor total debe ser mayor que cero."; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

        #endregion
    }

    #region Vista-modelo Detalle Facura
    public class VMFacturacionVariosDetalle : ViewModelBase, IDataErrorInfo
    {
        #region Campos
            private MFacturacion.facturacionVarios _items = new MFacturacion.facturacionVarios();
            private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        #endregion

        #region Constructor
            
            public VMFacturacionVariosDetalle(MFacturacion.facturacionVarios items, ValidateItems _validarItems, PideCliente _pideCliente)
            {
                _items = items;
                validarItems += _validarItems;
                pideCliente += _pideCliente;
            }

            public VMFacturacionVariosDetalle()
            {
                agregar = true;
            }
        #endregion

        #region Propiedades
            
            public ValidateItems validarItems { get; set; }
            public PideCliente pideCliente { get; set; }

            public string strCodigo
            {
                get { return _items.strCodigo; }
                set 
                { 
                    _items.strCodigo = value;
                    if (value != null)
                    {
                        if (value.Trim().Trim().Length == 4 || value.Trim().Trim().Length == 6 || value.Trim().Trim().Length == 10)
                            buscarCodigo();

                        if (value.Length == 10 || value.Length == 6)
                        {
                            if (strDescripcion == null)
                            {
                                _items.strCodigo = "";
                                strCodigo = "";
                            }
                            else
                            {
                                if (strDescripcion.Length == 0)
                                {
                                    _items.strCodigo = "";
                                    strCodigo = "";
                                }
                            }
                        }
                    }
                    
                    base.OnPropertyChanged("strCodigo"); 
                }
            }

            public string strDescripcion
            {
                get { return _items.strDescripcion; }
                set { _items.strDescripcion = value; base.OnPropertyChanged("strDescripcion"); }
            }
            
            public double numCantidad
            {
                get { return _items.numCantidad; }
                set 
                { 
                    _items.numCantidad = value;
                    if (_items.numCantidad > 0 && numValor > 0)
                        numSubtotal = numCantidad * _items.numValor;
                    base.OnPropertyChanged("numCantidad"); 
                }
            }

            public double numValor
            {
                get { return _items.numValor; }
                set 
                { 
                    _items.numValor = value;
                    if (_items.numValor > 0 && numCantidad > 0)
                        numSubtotal = numCantidad * _items.numValor;
                    base.OnPropertyChanged("numValor"); 
                }
            }

            public double numIva
            {
                get { return _items.numIva; }
                set { _items.numIva = value; base.OnPropertyChanged("numIva"); }
            }

            public double numTotalIva
            {
                get { return _items.numTotalIva; }
                set { _items.numTotalIva = value; base.OnPropertyChanged("numTotalIva"); }
            }

            public double numDescuento
            {
                get { return _items.numDescuento; }
                set { _items.numDescuento = value; base.OnPropertyChanged("numDescuento"); }
            }

            public double numSubtotal
            {
                get { return _items.numSubtotal; }
                set { _items.numSubtotal = value; base.OnPropertyChanged("numSubtotal"); }
            }

            private string _strCliente;
            public string strCliente
            {
                get { return _strCliente; }
                set
                {
                    _strCliente = value;
                    base.OnPropertyChanged("strCliente");
                }
            }

            private bool _actualizar = false;
            public bool actualizar
            {
                get { return _actualizar; }
                set { _actualizar = value; base.OnPropertyChanged("actualizar"); }
            }

            private bool _eliminar = false;
            public bool eliminar
            {
                get { return _eliminar; }
                set { _eliminar = value; base.OnPropertyChanged("eliminar"); }
            }

            private bool _agregar = false;
            public bool agregar
            {
                get { return _agregar; }
                set { _agregar = value; base.OnPropertyChanged("agregar"); }
            }

        #endregion

        #region Metodos
            
            public delegate string ValidateItems(string strCodigo);
            public delegate string PideCliente(string strCliente);
            
            public MFacturacion.facturacionVarios getItems()
            {
                return _items;
            }

            private void buscarCodigo()
            {
                try
                {
                    string strCodCli = this.pideCliente(strCliente);
                    DataTable dt = _repositorio.consultarCodigoFactVar(strCodigo, strCodCli);
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (dr["NUMEXISTE"].ToString() == "1")
                        {
                            strDescripcion = dr["STRNOMBRE"].ToString();
                            numIva = Convert.ToDouble(dr["NUMIVA"]);
                            numValor = Convert.ToDouble(dr["VALOR"]);
                            base.OnPropertyChanged("strDescripcion");
                            base.OnPropertyChanged("numIva");
                        }
                        else
                        {
                            strDescripcion = "";
                            base.OnPropertyChanged("strDescripcion");
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
            }

        #endregion

        #region IDataErrorInfo Members

            string IDataErrorInfo.Error { get { return null; } }

            string IDataErrorInfo.this[string propertyName]
            {
                get { return this.GetValidationError(propertyName); }
            }

        #endregion

        #region Validation

            /// <summary>
            /// Returns true if this object has no validation errors.
            /// </summary>
            /// 

            public bool IsValid
            {
                get
                {
                    foreach (string property in ValidatedProperties)
                        if (GetValidationError(property) != null)
                            return false;

                    return true;
                }
            }

            static readonly string[] ValidatedProperties = 
                    { 
                        "strCodigo",
                        "strDescripcion",
                        "numCantidad",
                        "numValor",
                        "numIva",
                        "numDescuento",
                        "numSubtotal"
                    };

            string GetValidationError(string propertyName)
            {
                string error = null;

                if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                    return null;

                //&& CODCPT_NVP.Length==3
                switch (propertyName)
                {
                    case "strCodigo":
                        error = this.ValidateCodigo();
                        break;
                    case "strDescripcion":
                        error = this.ValidateCodigo();
                        break;
                    case "numCantidad":
                        error = this.ValidateCantidad();
                        break;
                    case "numValor":
                        error = this.ValidateValor();
                        break;
                    case "numIva":
                        error = this.ValidateIva();
                        break;
                    case "numDescuento":
                        error = this.ValidateDesc();
                        break;
                    case "numSubtotal":
                        error = this.ValidateSubtotal();
                        break;
                    default:
                        Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                        break;
                }
                return error;
            }

            string ValidateCodigo()
            {
                string error = null;

                try
                {
                    if (strCodigo != null)
                    {
                        if (strCodigo != "")
                        {
                            if (strCodigo.Length != 4 && strCodigo.Length != 6 && strCodigo.Length != 10)
                                return "Debe ingresar un código de referencia o de materia prima.";
                            else
                            {
                                error = validarItems(strCodigo);
                                if (!String.IsNullOrEmpty(error)) { return error; }
                            }
                        }
                    }

                    if (strDescripcion != null)
                    {
                        if (strDescripcion == "" && strCodigo != "")
                        {
                            return "Codigo de producto invalido.";
                        }
                    }
                    
                    if (strDescripcion != null )
                    {
                        if (strDescripcion != "")
                        {
                            if (strDescripcion.Length < 4)
                                return "Debe ingresar una descripción más detallada.";
                            else
                                error = validarItems(strCodigo);
                        }
                    }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateCantidad()
            {
                try
                {
                    if (strDescripcion != null)
                    {
                        if (strDescripcion != "" && strDescripcion.Length>3)
                        {
                            if (numCantidad < 0) { return "La cantidad debe ser mayor que cero."; }
                            
                            return null;
                        }
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateValor()
            {
                try
                {
                    if (numCantidad > 0)
                    {
                        if (numValor <= 0) { return "El valor debe ser mayor que cero."; }
                        return null;
                    }
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateIva()
            {
                try
                {
                    if (numIva < 0) { return "El iva no puede ser negativo."; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

            string ValidateDesc()
            {
                try
                {
                    if (numDescuento < 0) { return "El descuento no puede ser negativo."; }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }
            string ValidateSubtotal()
            {
                try
                {
                    if (numCantidad > 0)
                    {
                        if (numSubtotal <= 0) { return "Hay un error en los valores ingresados."; }
                    }
                    return null;
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

        #endregion
    }
    #endregion

    #region Vista-modelo Importar Devolucion
    public class VMImportarDevoluciones : ViewModelBase
    {
        #region Campos
        private MFacturacion.devoluciones _items = new MFacturacion.devoluciones();
        #endregion

        #region Constructor

        public VMImportarDevoluciones(MFacturacion.devoluciones items)
        {
            _items = items;
        }

        public VMImportarDevoluciones()
        {
            
        }

        #endregion

        #region Propiedades

        public string strOrden
        {
            get { return _items.strOrden; }
            set { _items.strOrden = value; base.OnPropertyChanged("strOrden"); }
        }

        public string strRemision
        {
            get { return _items.strRemision; }
            set { _items.strRemision = value; base.OnPropertyChanged("strRemision"); }
        }

        public string strFecha
        {
            get { return _items.strFecha; }
            set { _items.strFecha = value; base.OnPropertyChanged("strFecha"); }
        }

        public string strNombreReferencia
        {
            get { return _items.strNombreReferencia; }
            set { _items.strNombreReferencia = value; base.OnPropertyChanged("strNombreReferencia"); }
        }

        public string strNombreColor
        {
            get { return _items.strNombreColor; }
            set { _items.strNombreColor = value; base.OnPropertyChanged("strNombreColor"); }
        }

        public string strTalla
        {
            get { return _items.strTalla; }
            set { _items.strTalla = value; base.OnPropertyChanged("strTalla"); }
        }

        public Int32 numPrecio
        {
            get { return _items.numPrecio; }
            set { _items.numPrecio = value; base.OnPropertyChanged("numPrecio"); }
        }

        public string strNumeroReparacion
        {
            get { return _items.strNumeroReparacion; }
            set { _items.strNumeroReparacion = value; base.OnPropertyChanged("strNumeroReparacion"); }
        }

        public bool logIncluir
        {
            get { return _items.logIncluir; }
            set { _items.logIncluir = value; base.OnPropertyChanged("logIncluir"); }
        }

        #endregion

        #region Metodos
        public delegate string PideCliente(string strCliente);

        public MFacturacion.devoluciones getItems()
        {
            return _items;
        }
        #endregion

    }
    #endregion
}
